/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trabalhocompiladores.entidade.automato.Operacoes;

import trabalhocompiladores.entidade.Automato;
import trabalhocompiladores.entidade.Estado;
import trabalhocompiladores.entidade.Expressao;
import trabalhocompiladores.entidade.Transacao;

/**
 *
 * @author u031254
 */
public class OperacaoUniao implements IOperacoes{

    @Override
    public void gerarEstados(Automato automato, Expressao expressao) {
        
      //Variável local para contagem dos estados <code>contStates</code>
      Integer contStates, contStatesInicial;
      contStates = contStatesInicial = automato.getEstados().size();
      
      
         //pega o estado atual
         Estado primeiroEstado =  automato.getEstados().get(contStates - 1);

         //gera a relação para inicio da primeira expressao
         automato.gerarAFN("e");
         automato.resolverExpressao(expressao.getPrimeiroFilho());
         //pegando o estado do fim do primeira expressao
         contStates = automato.getEstados().size();
         Estado finalPrimeiroFilho =  automato.getEstados().get(contStates - 1);
         
         //gerando a segunda expressao
         Estado inicioSegundoFilho = new Estado(automato.getEstados().size());
         automato.getEstados().put(inicioSegundoFilho.getId(), inicioSegundoFilho);
         automato.resolverExpressao(expressao.getSegundoFilho());
         
         //pegando fim da segunda expressao
         contStates = automato.getEstados().size();
         Estado finalsegundoFilho = automato.getEstados().get(contStates - 1);

         //gerando um ultimo estado para linkar as expressoes
         automato.gerarAFN("e");

         //pegando o ultimo estado
         contStates = automato.getEstados().size();
         Estado ultimoEstado =  automato.getEstados().get(contStates-1);
         
         //resolvendo as transações
         primeiroEstado.getLista().add(new Transacao("e",primeiroEstado,inicioSegundoFilho));
         finalPrimeiroFilho.getLista().add(new Transacao("e",finalPrimeiroFilho,ultimoEstado));
         
      
      
    }   
}
